package main

import "fmt"

/*
不要通过共享内存来通信，而应该通过通信来共享内存。所以需要通道来各个goroutine之间通信。

通道是什么，通道就是goroutine之间的通道，它可以让goroutine之间相互通信。
每个通道都有与其相关的类型，该类型是通道允许传输的数据类型。（通道的零值为nil，nil通道没有任何用处，因此通道必须使用类似于切片的方法来定义）
*/

/*
 1. 声明一个通道
    var 通道名 chan 数据类型

 2. 创建通道： 如果通道为nil，就需要先创建通道
    通道名 = make(chan 数据类型)

    通道的发送和接受：
    data := <- a  //read from channel a
    a <- data // write to channel a

    v, ok := <- a // 从一个channel中读取， ok检测通道是否关闭，ok=true，代表获取到数据；ok=false,代表通道已经关闭
*/

/*
*

		Channel通道在使用的时候，有以下几个注意点：
		1. 用于goroutine,传递消息的
		2. 通道，每个都有相关联的数据类型，nil chan 不能使用，类似于nil map，不能直接存储键值对
		3. 使用通道传递数据：  chan <- data,发送数据到通道，向通道中写数据
							data <- chan, 从通道中获取数据
		4. 阻塞
			发送数据： chan <- data,阻塞的，直到有另一条goroutine读取数据来解除阻塞
	        读取数据： data <- chan,阻塞的，直到另一条goroutine写出数据解除阻塞
	    5. 本身channel就是同步的，意味着同一时间，只能有一条goroutine来操作

最后：通道是goroutine之间的连接，所以通道的发送和接受必须处在不同的goroutine中
*/
func main() {

	ch1 := make(chan int)
	go func() {
		for i := 1; i < 1000; i++ {
			fmt.Println(i)
		}
		ch1 <- 1
		fmt.Println("go routine over....")
	}()

	data := <-ch1
	fmt.Println(data)
}
